Cargar las librerías

# Cargo las librerías
library(sf)
library(tidyverse)
library(mapdeck)
library(knitr)
library(kableExtra)

#devtools::install_github("meneos/elecciones") # <--- Instala la librería elecciones

library(elecciones)

Importar el shapefile

Empezamos importanto el shapefile de la Comunidad de Madrid y selecciono solo la ciudad de Madrid.

shp <- read_sf("~/Google Drive/DATOS/R/COMPORTAMIENTO ELECTORAL/shp/Comunidad de Madrid/2015/corregido/secciones_corregidas.shp", quiet = T) ### Importo el shapefile 
shp <- shp[substr(shp$GEOCODIGO, 1, 3) == "079",]  # Selecciono solo la ciudad de Madrid
shp <-  st_transform(shp, 4326)  # Transformo la proyección

Descargar los resultados

Me descargo los resultados a nivel de mesa de las elecciones municipales de mayo de 2015 y me quedo solo con los de la ciudad de Madrid.

results.muni <- mesas("municipales", "2015", "05") # Descargo los datos

results.muni <- results.muni[results.muni$provincia == "28" & results.muni$municipio == "079",] # 28 = Comunidad de Madrid | 079 = Ciudad de Madrid


ktab <- kable(head(results.muni), digits = 4, align = "l", row.names = F)
kable_styling(ktab, bootstrap_options = c("striped", "hover")) %>% scroll_box(width = "100%", height = "200px")
eleccion year mes partido ccaa provincia municipio distrito seccion mesa censo.INE CERA CERE votantes.CERE blancos nulos candidaturas votos siglas denominacion code.provincia code.autonomia code.nacional
04 2015 05 120806 12 28 079 13 186 A 836 836 12 0 3 3 511 200 AhoraMadrid AHORA MADRID 000806 000806 000806
04 2015 05 120806 12 28 079 08 006 U 764 764 2 0 9 3 580 69 AhoraMadrid AHORA MADRID 000806 000806 000806
04 2015 05 120806 12 28 079 13 057 U 1006 1006 9 0 5 3 582 207 AhoraMadrid AHORA MADRID 000806 000806 000806
04 2015 05 120806 12 28 079 02 040 A 739 739 7 0 2 4 528 187 AhoraMadrid AHORA MADRID 000806 000806 000806
04 2015 05 120806 12 28 079 07 034 A 622 622 9 0 1 4 413 132 AhoraMadrid AHORA MADRID 000806 000806 000806
04 2015 05 120806 12 28 079 08 164 A 786 786 7 0 5 4 603 148 AhoraMadrid AHORA MADRID 000806 000806 000806

Agrupar las mesas en secciones

Los datos se descargan a nivel de mesa electoral pero yo los quiero a nivel de sección censal. Así que agrupo los datos y me quedo solo con los cinco partidos más votados.

# Agrupo los datos
seccs.muni <- results.muni %>% 
  group_by(year, mes, municipio, distrito, seccion, siglas) %>% 
  summarise(censo = sum(censo.INE), 
            votos.candidatura = sum(candidaturas), 
            votos = sum(votos))

# Selecciono a los cinco partidos
seccs.muni <- seccs.muni[seccs.muni$siglas %in% c("P.P.", "C's", "AhoraMadrid", "P.S.O.E.", "IZQUIERDA U"),]

# Transformo los datos de formato long a wide 
seccs.muni <- spread(seccs.muni, key = siglas, value = votos)

# Calculo los % sobre censo
seccs.muni$PP_pct <- round((seccs.muni$P.P. / seccs.muni$censo ) * 100, 2)
seccs.muni$PSOE_pct <- round(( seccs.muni$P.S.O.E. / seccs.muni$censo ) * 100, 2)
seccs.muni$AM_pct <- round(( seccs.muni$AhoraMadrid / seccs.muni$censo ) * 100, 2)
seccs.muni$Cs_pct <- round(( seccs.muni$`C's` / seccs.muni$censo ) * 100, 2)


ktab <- kable(head(seccs.muni), digits = 4, align = "l", row.names = F)
kable_styling(ktab, bootstrap_options = c("striped", "hover")) %>% scroll_box(width = "100%", height = "200px")
year mes municipio distrito seccion censo votos.candidatura AhoraMadrid C’s IZQUIERDA U P.P. P.S.O.E. PP_pct PSOE_pct AM_pct Cs_pct
2015 05 079 01 001 867 588 215 62 4 217 73 25.03 8.42 24.80 7.15
2015 05 079 01 002 661 427 224 38 6 102 44 15.43 6.66 33.89 5.75
2015 05 079 01 003 1126 693 265 52 18 264 75 23.45 6.66 23.53 4.62
2015 05 079 01 004 963 689 279 71 2 247 64 25.65 6.65 28.97 7.37
2015 05 079 01 006 1298 899 405 92 11 286 68 22.03 5.24 31.20 7.09
2015 05 079 01 007 645 431 213 44 4 124 35 19.22 5.43 33.02 6.82

Fusiono los datos con el shapefile

Creo una columna en el data frame de los datos con valores identificadores de cada seccion censal que ya está presente en el shapefile para fusionar datos y shapefile.

seccs.muni$GEOCODIGO <- paste0(seccs.muni$municipio, seccs.muni$distrito, seccs.muni$seccion)

shp <- merge(shp, seccs.muni, by = "GEOCODIGO")

Visualizamos

Uso la librería mapdeck para visualizar un mapa del voto a Ahora Madrid.

# Introducir el token de Mapbox
tkn <- readLines("~/Google Drive/DATOS/R/MAPAS MAS MADRID/token.txt")

# Para el panel hover
shp$info <- paste0("<br><b> Sobre censo</br></b>",
                         "<br><b>", "PP: ", "</b>", shp$PP_pct, " %", "</br>",
                         "<br><b>", "Ahora Madrid: ", "</b>" ,shp$AM_pct, " %", "</br>",
                         "<br><b>", "PSOE: ", "</b>" ,shp$PSOE_pct, " %", "</br>",
                         "<br><b>", "Ciudadanos: ", "</b>" ,shp$Cs_pct, " %", "</br>")


# Rampa de colores
m <- grDevices::colorRamp(c("#e1f7f2", "#26a58e"))( (1:256)/256 )


mapdeck(token = tkn, 
        width = 1600/2, 
        height = 900/2, 
        style = mapdeck_style(style = "light"), 
        location = c(-3.71133, 40.42244),
        zoom = 9) %>%
  add_polygon(data = shp,
              layer_id = "AM", 
              fill_colour = "AM_pct", palette = m, 
              tooltip = "info", 
              fill_opacity = 200, legend = T, 
              update_view = F,
              legend_options = list(title = "Ahora Madrid",
                                    subtitle = "Sobre censo",
                                    css = "font-family: Roboto Condensed"))

O lo guardamos

También podemos guardar el shapefile para abrirlo con alguna aplicación GIS. En este caso lo guardo como un Geopackage.

sf::write_sf(shp, "~/Google Drive/DATOS/R/MAPAS MAS MADRID/GPKG/elecciones24M.gpkg", driver = "GPKG")